這裡有沒有寶友啊~~~
今天台南sarfari zone開跑,讓小妹我好想趕快下去參加喔~~~
不過我這個六日就會去共襄盛舉啦~ 所以現在要來多存幾篇到時候發XD
昨天我們完成了Server版本的node,今天就是要來製作client node去打這個service囉!
一樣先創一個新的add_two_ints_client.py
檔,並且設置成可執行:
$ roscd beginner_tutorials/src
$ vim add_two_ints_client.py
$ chmod +x add_two_ints_client.py
程式碼如下:
1 #!/usr/bin/env python
2
3 import sys
4 import rospy
5 from rospy_tutorials.srv import *
6
7 def add_two_ints_client(x, y):
8 rospy.wait_for_service('add_two_ints')
9 try:
10 add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
11 resp1 = add_two_ints(x, y)
12 return resp1.sum
13 except rospy.ServiceException, e:
14 print "Service call failed: %s"%e
15
16 def usage():
17 return "%s [x y]"%sys.argv[0]
18
19 if __name__ == "__main__":
20 if len(sys.argv) == 3:
21 x = int(sys.argv[1])
22 y = int(sys.argv[2])
23 else:
24 print usage()
25 sys.exit(1)
26 print "Requesting %s+%s"%(x, y)
27 print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))
其實有時候不知道到底放程式碼上來的時候要不要附行號,因為這樣就不能直接複製貼上了 XD
這邊比較需要注意的是client並不需要呼叫init_node(),直接call service就可以了:
8 rospy.wait_for_service('add_two_ints')
這邊就是在監聽啦! 先等service架起來以後就可以去打了這樣。
wait_for_service的函式定義如下:
rospy.wait_for_service(service, timeout=None)
第一個參數就是service名稱,第二個參數可以設定等待的時間,如果超時就回傳一個exception表示發生異常。
10 add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
這邊就是在打API打去給server啦!ServiceProxy的函式定義如下:
rospy.ServiceProxy(name, service_class, persistent=False, headers=None)
最多可以有四個參數,第一個參數就是service name,第二個參數是service的格式,第三個參數persistent表示是否要讓這個client一直跟server連接,這個設定可以允許client在呼叫service的時候連去別的node,但使用上需要很小心,需要自己定義連結失敗的時候要怎麼處理。
第四個參數header是在每次呼叫的時候都可以放在標頭的參數,可以用來製作cookies。(看完之後覺得跟打API更像了 XD)
完成後記得執行catkin_make
,依照官網所說是為了確保service建置完成。
最後執行畫面就是長這樣啦! 接下來我會寫兩篇C++的版本,然後做個小結,就可以出發台南囉~~~~